package com.atguigu.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.entity.UserInfo;
import com.atguigu.result.Result;
import com.atguigu.result.ResultCodeEnum;
import com.atguigu.service.UserInfoService;
import com.atguigu.util.MD5;
import com.atguigu.util.ValidateCodeUtils;
import com.atguigu.vo.LoginVo;
import com.atguigu.vo.RegisterVo;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;


@RestController
@RequestMapping(value = "/userInfo")
public class UserInfoController {
    @Reference
    private UserInfoService userInfoService;

    // 发送验证码 /userInfo/sendCode/
    @RequestMapping("sendCode/{phone}")
    public Result sendCode(@PathVariable("phone") String phone, HttpServletRequest request) {
        //设置验证码
        String code = ValidateCodeUtils.generateValidateCode4String(6);
        // 将session验证码
        request.getSession().setAttribute("code", code);
        // 将验证码响应到前端
        return Result.ok(code);
    }

    // 注册
    @PostMapping("/register")
    public Result register(@RequestBody RegisterVo registerVo, HttpSession session) {
        // 获取手机号，昵称，验证码
        String phone = registerVo.getPhone();
        String nickName = registerVo.getNickName();
        String code = registerVo.getCode();
        String password = registerVo.getPassword();
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(nickName) || StringUtils.isEmpty(code) || StringUtils.isEmpty(password)){
            // 返回参数错误的消息
            return Result.build(null, ResultCodeEnum.PARAM_ERROR);
        }

        // 从session域中获取验证码
        String sessionCode = (String) session.getAttribute("code");
        if (!code.equals(sessionCode)){
            // 返回验证码错误的消息
            return Result.build(null,ResultCodeEnum.CODE_ERROR);
        }

        // 调用UserService的方法判断是否已经注册
        UserInfo userInfo = userInfoService.getUserInfoByPhone(phone);
        if (userInfo != null){
            // 返回手机号已经注册的消息
            return Result.build(null,ResultCodeEnum.PHONE_REGISTER_ERROR);
        }
        // 创建一个UserInfo对象，然后导入数据库中
        UserInfo userInfo1 = new UserInfo();
        userInfo1.setPhone(phone);
        userInfo1.setNickName(nickName);
        userInfo1.setPassword(MD5.encrypt(password));
        userInfo1.setStatus(1); // 1 正常状态，0 锁定状态

       // 调用UserInfoService 中插入用户的方法
       userInfoService.insert(userInfo1);

        return Result.ok();
    }
    // 登录
    @RequestMapping("login")
    public Result login(@RequestBody LoginVo loginVo, HttpSession session){
        // 获取手机号和密码
        String phone = loginVo.getPhone();
        String password = loginVo.getPassword();
        // 判空
        if (StringUtils.isEmpty(password) || StringUtils.isEmpty(password)){
         return Result.build(null,ResultCodeEnum.PARAM_ERROR);
        }
        //根据手机号获取信息
        UserInfo userInfo = userInfoService.getUserInfoByPhone(phone);
        if (userInfo == null){
            // 用户不存在，账户不正确
            return Result.build(null,ResultCodeEnum.ACCOUNT_ERROR);
        }
        // 验证密码是否正确
        if(!MD5.encrypt(loginVo.getPassword()).equals(userInfo.getPassword())){
            return Result.build(null,ResultCodeEnum.PASSWORD_ERROR);
        }
        // 判断用户是否是锁定状态
        if (userInfo.getStatus()==0){
            // 用户已经被锁定
            return Result.build(null,ResultCodeEnum.ACCOUNT_LOCK_ERROR);
        }
        // 登录成功，在后台判断用户是否是登录的状态（判断session域）
        session.setAttribute("USER",userInfo);
        // 创建一个map（map中必须存放nickname）
        Map map = new HashMap<>();
        map.put("nickname",userInfo.getNickName());
        map.put("phone",phone);
        return Result.ok(map);
    }
    @GetMapping("/logout")
    public Result logout(HttpServletRequest request) {
        request.getSession().removeAttribute("USER");
        return Result.ok();
    }
}
